package com.uva.dbcs.web.beans.gestionDeVehiculos;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import com.uva.dbcs.gestionDeVehiculos.despliegue.GestorDeVehiculosLocal;
import com.uva.dbcs.gestionDeVehiculos.dominio.Carnet;
import com.uva.dbcs.gestionDeVehiculos.dominio.Fabricante;
import com.uva.dbcs.gestionDeVehiculos.dominio.Modelo;
import com.uva.dbcs.gestionDeVehiculos.dominio.Vehiculo;

@ManagedBean
@ViewScoped
public class VehiculosBean implements Serializable {

	@EJB
	private GestorDeVehiculosLocal gestorDeVehiculos;

	private List<Vehiculo> vehiculos;

	private List<Vehiculo> vehiculosFiltrados;

	private String fabricanteSeleccionado;
	
	private Modelo modeloSeleccionado;

	private String modeloSeleccionadoString;

	private Vehiculo vehiculoSeleccionado;

	private String matriculaIntroducida;

	private String colorIntroducido;

	private double costeAdquisicionIntroducido;

	private double kilometrajeIntroducido;

	private String imagenIntroducida;

	private Date fechaIntroducida;

	private List<Modelo> modelos;

	private List<Fabricante> fabricantes;

	private ArrayList<String> fabricantesString;
	
	private ArrayList<String> modelosString;
	
	private static final long serialVersionUID = 1L;

	public VehiculosBean() {

	}

	@PostConstruct
	public void init() {

		vehiculos = gestorDeVehiculos.getVehiculos();
		
		fabricantes = gestorDeVehiculos.getFabricantes();
		
		Collections.sort(fabricantes);
		
		fabricantesString = new ArrayList<String>();
		
		for (Fabricante f: fabricantes){
			fabricantesString.add(f.getNombre());
		}

	}

	public List<Vehiculo> getVehiculos() {
		return vehiculos;
	}

	public void setVehiculos(List<Vehiculo> vehiculos) {
		this.vehiculos = vehiculos;
	}

	public List<Modelo> getModelos() {
		return modelos;
	}

	public void setModelos(List<Modelo> modelos) {
		this.modelos = modelos;
	}

	public List<Fabricante> getFabricantes() {
		return fabricantes;
	}

	public void setFabricantes(List<Fabricante> fabricantes) {
		this.fabricantes = fabricantes;
	}

	public Vehiculo getVehiculoSeleccionado() {
		return vehiculoSeleccionado;
	}

	public void setVehiculoSeleccionado(Vehiculo vehiculoSeleccionado) {
		this.vehiculoSeleccionado = vehiculoSeleccionado;
	}

	public List<Vehiculo> getVehiculosFiltrados() {
		return vehiculosFiltrados;
	}

	public void setVehiculosFiltrados(List<Vehiculo> vehiculosFiltrados) {
		this.vehiculosFiltrados = vehiculosFiltrados;
	}

	public String getFabricanteSeleccionado() {
		return fabricanteSeleccionado;
	}

	public void setFabricanteSeleccionado(String fabricanteSeleccionado) {
		this.fabricanteSeleccionado = fabricanteSeleccionado;
	}


	public GestorDeVehiculosLocal getGestorDeVehiculos() {
		return gestorDeVehiculos;
	}

	public void setGestorDeVehiculos(GestorDeVehiculosLocal gestorDeVehiculos) {
		this.gestorDeVehiculos = gestorDeVehiculos;
	}

	public String getMatriculaIntroducida() {
		return matriculaIntroducida;
	}

	public void setMatriculaIntroducida(String matriculaIntroducida) {
		this.matriculaIntroducida = matriculaIntroducida;
	}

	public String getColorIntroducido() {
		return colorIntroducido;
	}

	public void setColorIntroducido(String colorIntroducido) {
		this.colorIntroducido = colorIntroducido;
	}

	public double getCosteAdquisicionIntroducido() {
		return costeAdquisicionIntroducido;
	}

	public void setCosteAdquisicionIntroducido(
			double costeAdquisicionIntroducido) {
		this.costeAdquisicionIntroducido = costeAdquisicionIntroducido;
	}

	public double getKilometrajeIntroducido() {
		return kilometrajeIntroducido;
	}

	public void setKilometrajeIntroducido(double kilometrajeIntroducido) {
		this.kilometrajeIntroducido = kilometrajeIntroducido;
	}

	public String getImagenIntroducida() {
		return imagenIntroducida;
	}

	public void setImagenIntroducida(String imagenIntroducida) {
		this.imagenIntroducida = imagenIntroducida;
	}

	public Date getFechaIntroducida() {
		return fechaIntroducida;
	}

	public void setFechaIntroducida(Date fechaIntroducida) {
		this.fechaIntroducida = fechaIntroducida;
	}

	public String getCarnetsVehiculoSeleccionado() {

		if (vehiculoSeleccionado != null) {

			String s = new String();
			for (Carnet carnet : vehiculoSeleccionado.getModelo().getCarnets()) {
				s = s + carnet.getNombreCarnet() + ", ";
			}

			return s;
		}

		return null;
	}
	


	public String getModeloSeleccionadoString() {
		return modeloSeleccionadoString;
	}

	public void setModeloSeleccionadoString(String modeloSeleccionadoString) {
		this.modeloSeleccionadoString = modeloSeleccionadoString;
		
		// buscamos el modelo seleccionado, que será un string
		for (Modelo m: modelos){
			
			if (m.getNombre().equals(this.modeloSeleccionadoString)){
				
				this.modeloSeleccionado = m;
				break;
			}
		}
	}
	



	public void fabricanteChange() {
		
		System.out.println("fabricante change");

		if (fabricanteSeleccionado != null) {

			Fabricante seleccion = null;
			
			// buscamos el fabricante seleccionado, que será un string
			for (Fabricante f: fabricantes){
				
				if (f.getNombre().equals(fabricanteSeleccionado)){
					
					seleccion = f;
					break;
				}
			}
			
			seleccion = gestorDeVehiculos.refreshFabricante(seleccion);
			
			this.modelos = seleccion.getModelos();
			
			Collections.sort(this.modelos);
			
			this.modelosString = new ArrayList<String>();
			
			for (Modelo m: modelos){
				this.modelosString.add(m.getNombre());
			}
			
			
			
		} else {

			this.modelosString = null;
			this.modelos = null;
		}

	}
	
	public void modeloChange() {

		System.out.println("modelo change");

	}

	public void nuevoVehiculo() {
		
		

		// recogemos los datos y creamos el nuevo vehículo.
		gestorDeVehiculos.crearNuevoVehiculo(false, colorIntroducido,
				costeAdquisicionIntroducido, fechaIntroducida,
				kilometrajeIntroducido, matriculaIntroducida,
				imagenIntroducida, modeloSeleccionado.getIdmodelo());
		
		FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage("Vehiculo creado correctamente"));
		
		// se actualizan los vehiculos para que se vean en la tabla de la misma página
		vehiculos = gestorDeVehiculos.getVehiculos();

	}
	

	public Modelo getModeloSeleccionado() {
		return modeloSeleccionado;
	}

	public void setModeloSeleccionado(Modelo modeloSeleccionado) {
		this.modeloSeleccionado = modeloSeleccionado;
	}

	public ArrayList<String> getFabricantesString() {
		return fabricantesString;
	}

	public void setFabricantesString(ArrayList<String> fabricantesString) {
		this.fabricantesString = fabricantesString;
	}

	public ArrayList<String> getModelosString() {
		return modelosString;
	}

	public void setModelosString(ArrayList<String> modelosString) {
		this.modelosString = modelosString;
	}

	
	

}

